﻿using System.Collections.Generic;
using System.Xml;
using System;
using l1cs.server.utils;
using System.Collections;

namespace l1cs.server.model.npc.action
{
    public class L1NpcXmlParser
    {
        public static List<L1NpcAction> listActions( XmlReader reader )
        {
            List<L1NpcAction> result = new List<L1NpcAction>();

            //for (Element elem : new IterableElementList(list)) {
            while ( reader.Read() )
            {
                if ( reader.NodeType == XmlNodeType.Element )
                {
                    L1NpcAction action = L1NpcActionFactory.newAction( reader );
                    if ( action != null )
                    {
                        result.Add( action );
                    }
                }
                else if ( reader.NodeType == XmlNodeType.EndElement )
                {
                    break;
                }
            }
            return result;
        }

        public static Hashtable getAllAttribute( XmlReader reader )
        {
            Hashtable attribute = new Hashtable();

            // 属性があった場合
            if ( reader.HasAttributes )
            {
                // すべての属性を表示
                for ( int i = 0; i < reader.AttributeCount; i++ )
                {
                    // 属性ノードへ移動
                    reader.MoveToAttribute( i );
                    // 属性名、及び属性の値を表示
                    attribute.Add( reader.Name, reader.Value );
                }
                // すべての属性を出力したら、元のノード(エレメントノード)に戻る
                reader.MoveToElement();
            }

            return attribute;
        }
        //public static Element getFirstChildElementByTagName(Element element,
        //        String tagName) {
        //    IterableElementList list = new IterableElementList(element
        //            .getElementsByTagName(tagName));
        //    for (Element elem : list) {
        //        return elem;
        //    }
        //    return null;
        //}

        public static int getIntAttribute( String value, int defaultValue )
        {
            if ( value == null )
            {
                return defaultValue;
            }
            else
            {
                return Convert.ToInt32( value );
            }
        }

        public static bool getBoolAttribute( String value, bool defaultValue )
        {
            bool result = defaultValue;

            if ( value != null && !value.Equals( "" ) )
            {
                result = Convert.ToBoolean( value );
            }
            return result;
        }

        private static Dictionary<String, int> _questIds = new Dictionary<String, int>();
        static L1NpcXmlParser()
        {
            _questIds.Add( "level15", L1Quest.QUEST_LEVEL15 );
            _questIds.Add( "level30", L1Quest.QUEST_LEVEL30 );
            _questIds.Add( "level45", L1Quest.QUEST_LEVEL45 );
            _questIds.Add( "level50", L1Quest.QUEST_LEVEL50 );
            _questIds.Add( "lyra", L1Quest.QUEST_LYRA );
            _questIds.Add( "oilskinmant", L1Quest.QUEST_OILSKINMANT );
            _questIds.Add( "doromond", L1Quest.QUEST_DOROMOND );
            _questIds.Add( "ruba", L1Quest.QUEST_RUBA );
            _questIds.Add( "lukein", L1Quest.QUEST_LUKEIN1 );
            _questIds.Add( "tbox1", L1Quest.QUEST_TBOX1 );
            _questIds.Add( "tbox2", L1Quest.QUEST_TBOX2 );
            _questIds.Add( "tbox3", L1Quest.QUEST_TBOX3 );
            _questIds.Add( "cadmus", L1Quest.QUEST_CADMUS );
            _questIds.Add( "resta", L1Quest.QUEST_RESTA );
            _questIds.Add( "kamyla", L1Quest.QUEST_KAMYLA );
            _questIds.Add( "lizard", L1Quest.QUEST_LIZARD );
            _questIds.Add( "desire", L1Quest.QUEST_DESIRE );
            _questIds.Add( "shadows", L1Quest.QUEST_SHADOWS );
            _questIds.Add( "toscroll", L1Quest.QUEST_TOSCROLL );
            _questIds.Add( "moonoflongbow", L1Quest.QUEST_MOONOFLONGBOW );
            _questIds.Add( "Generalhamelofresentment", L1Quest.QUEST_GENERALHAMELOFRESENTMENT );
        }
        public static int parseQuestId( String questId )
        {
            if ( questId == null || questId.Equals( "" ) )
            {
                return -1;
            }
            if ( !_questIds.ContainsKey( questId.ToLower() ) )
            {
                throw new Exception();
            }
            return _questIds[questId.ToLower()]; ;
        }

        public static int parseQuestStep( String questStep )
        {
            if ( questStep == null || questStep.Equals( "" ) )
            {
                return -1;
            }
            if ( questStep.Equals( "End" ) )
            {
                return L1Quest.QUEST_END;
            }
            return Convert.ToInt32( questStep );
        }
    }
}
